package com.rpcservice.rpc.util;

import org.mindrot.jbcrypt.BCrypt;

public class BCryptUtils {

    /**
     * 生成 BCrypt 加密后的密码（用于存储到配置文件或数据库）
     * @param plainPassword 明文密码（如 "Nacos@2024!"）
     * @return 加密后的字符串（如 "$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu"）
     */
    public static String encrypt(String plainPassword) {
        // 生成盐值（参数 10 表示加密强度，范围 4-31，值越大越安全但耗时越长）
        String salt = BCrypt.gensalt(10);
        // 用盐值加密明文密码
        return BCrypt.hashpw(plainPassword, salt);
    }

    /**
     * 验证明文密码与加密串是否匹配（用于登录时校验）
     * @param plainPassword 明文密码（用户输入的密码）
     * @param encryptedPassword 加密后的密码（从配置文件或数据库读取）
     * @return 匹配返回 true，否则返回 false
     */
    public static boolean verify(String plainPassword, String encryptedPassword) {
        if (encryptedPassword == null || encryptedPassword.isEmpty()) {
            return false;
        }
        // BCrypt 内部会自动提取加密串中的盐值进行验证
        return BCrypt.checkpw(plainPassword, encryptedPassword);
    }

    // 测试示例
    public static void main(String[] args) {
        // 明文密码（例如 Nacos 控制台登录密码）
        String plainPassword = "hk36.9opklm";

        // 加密
        String encryptedPassword = encrypt(plainPassword);
        System.out.println("加密后的密码（可直接配置到 Nacos）：" + encryptedPassword);

        // 验证
        boolean isMatch = verify(plainPassword, encryptedPassword);
        System.out.println("密码是否匹配：" + isMatch); // 输出 true
    }
}
